package server.persistencia;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.DescripcionRol;
import server.dominio.Persona;
import server.dominio.Usuario;


import java.util.ArrayList;import server.dominio.Medico;






public class DAOUsuarioMySQL extends DAOUsuario {
	private Agente Broker;
	private Connection Con;
	
	public DAOUsuarioMySQL() throws  SQLException{
            try{
			Broker= Agente.getAgente();
			Con= Broker.getConnection();
            }catch(SQLException ex){
                System.out.println("Cagada "+ ex);
                throw new SQLException();
            }catch(Exception ex){
                System.out.println(ex);
            }
	}

	@Override
	public int delete(Object Usu) throws SQLException{
		// TODO Auto-generated method stub
		PreparedStatement stmt;
		int result= 0;


		stmt = (PreparedStatement) Con.prepareStatement("DELETE FROM Usuario WHERE idUsuario_pk= ? OR nif= ?");
		stmt.setInt(1, ((Usuario)Usu).getIdUsuario_pk());
                stmt.setString(2, ((Usuario)Usu).getNif());
		result= stmt.executeUpdate();			
			
		return result;
	}

	@Override
	public int insert(Object obj) throws SQLException {
		Usuario aux= (Usuario)obj;
		int resul=0;

        	/*La persona no se inserta aki Debe estar ya insertada*/
		PreparedStatement stmt = (PreparedStatement) Con.prepareStatement("INSERT INTO Usuario VALUES (null, ?,?,?,?,?,?,?,?,?,?,?)");
		stmt.setString(1,aux.getLogin());
		stmt.setString(2, aux.getPass());
		stmt.setInt(3, (int)aux.getRol().getIdRol_pk());
      		stmt.setString(4, aux.getNif());
      		stmt.setString(5, aux.getNombre());
       		stmt.setString(6, aux.getApellidos());
		stmt.setString(7, aux.getDomicilio());
		stmt.setInt(8, aux.getTeleFijo());
		stmt.setInt(9, aux.getTeleMovil());
                stmt.setString(10, aux.getEmail());
                stmt.setString(11, aux.getFecha_nacimiento());
		resul= stmt.executeUpdate();
		
                 stmt.close();
		
		return resul;
	}

	@Override
	public ArrayList<Object> select(String condicion) throws SQLException{
		/* String condicion: Debe ser una subconsulta que incluya los datos de descripcion Rol y la persona*/
		ArrayList<Object> usuarios = new ArrayList<Object>();
		Statement stmt;
		
             
		DAODescripcionRolMySQL daoR= new DAODescripcionRolMySQL();	

                stmt = (Statement) Con.createStatement();
		ResultSet res  = stmt.executeQuery(condicion);
		 while(res.next()) 
                 {           
                    DescripcionRol nrol= (DescripcionRol)daoR.find("SELECT * FROM DESCRIPCIONROL WHERE idRol_pk = "+res.getInt("idRol_fk"));
                    Persona persona= new Persona(res.getString("nif"), res.getString("nombre"), res.getString("apellidos"), res.getString("domicilio"), res.getInt("telFijo"), res.getInt("telMovil"), res.getString("email"), res.getDate("fecha_nacimiento").toString());
                    Usuario aux= new Usuario(persona, res.getInt("idUsuario_pk"), res.getString("login"), res.getString("pass"), nrol);
                    usuarios.add(aux);
                 }
		 res.close(); 
		 stmt.close(); 

		 daoR.cerrarDAO();
		
		return usuarios;
	}

	@Override
	public int update(Object obj) throws SQLException {
            Usuario aux= (Usuario)obj;
            int resul=0;

            /*La persona no se inserta aki Debe estar ya insertada*/
            PreparedStatement stmt = (PreparedStatement) Con.prepareStatement("UPDATE Usuario set login= ?, pass= ?, " +
                    "idRol_fk= ?, nif= ?, nombre=?, apellidos=?, domicilio=?, telFijo=?, telMovil=?," +
                    " email=?, fecha_nacimiento=? where idUsuario_pk= ?");
            stmt.setString(1,aux.getLogin());
            stmt.setString(2, aux.getPass());
            stmt.setInt(3, (int)aux.getRol().getIdRol_pk());
            stmt.setString(4, aux.getNif());
            stmt.setString(5, aux.getNombre());
            stmt.setString(6, aux.getApellidos());
            stmt.setString(7, aux.getDomicilio());
            stmt.setInt(8, aux.getTeleFijo());
            stmt.setInt(9, aux.getTeleMovil());
            stmt.setString(10, aux.getEmail());
            stmt.setString(11, aux.getFecha_nacimiento());
            stmt.setInt(12, aux.getIdUsuario_pk());
            resul= stmt.executeUpdate();
             stmt.close();

            return resul;
	}

	@Override
	public Object find(String condicion) throws SQLException {
		// TODO Auto-generated method stub
		Usuario usu= null;
		Statement stmt;
		
        	DAODescripcionRolMySQL daoR= new DAODescripcionRolMySQL();
	
		stmt = (Statement) Con.createStatement();
		ResultSet res  = stmt.executeQuery(condicion);
		if(res.next()){
                	 DescripcionRol nrol= (DescripcionRol)daoR.find("SELECT * FROM DESCRIPCIONROL WHERE idRol_pk = "+res.getInt("idRol_fk"));
                         Persona persona= new Persona(res.getString("nif"), res.getString("nombre"), res.getString("apellidos"), res.getString("domicilio"), res .getInt("telFijo"), res.getInt("telMovil"), res.getString("email"), res.getDate("fecha_nacimiento").toString());
                         usu = new Usuario(persona, res.getInt("idUsuario_pk"), res.getString("login"), res.getString("pass"), nrol);
		}
                stmt.close();
                daoR.cerrarDAO();
         	
		return usu;
	}
	
	public void cerrarDAO(){
        try {
            Con.close();
        } catch (SQLException ex) {
            Logger.getLogger(DAOUsuarioMySQL.class.getName()).log(Level.SEVERE, null, ex);
        }

	}

}
